package com.xk._04regEx;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @description: 演示 反向引用 的使用
 * @author: xu
 * @date: 2022/11/2 10:12
 */
public class RegExp_12 {
    public static void main(String[] args) {
        String content = "h5225ello jack tom1123 12322-333929111jack2222 yyy xxx1221";

        // 匹配两个连续的相同数字 --> (\\d)\\1
        // 匹配五个连续的相同数字 --> (\\d)\\1{4}
        // 匹配个位与千位相同，十位与百位相同的四位数(5225、1551) --> (\\d)(\\d)\\2\\1
        /*
        * 请在字符串中检索商品编号，形式如：12321-333999111 这样的编号
        * 要求满足前面是一个五位数，然后是一个'-'号，然后是一个九位数(九位数中连续的每三位要相同)
        * \\d{5}-(\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2}
        * */
        String regStr = "\\d{5}-(\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2}";
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) {
            System.out.println("找到：" + matcher.group(0));
        }
    }

    /*
    * 分组：我们可以用圆括号'()'组成一个比较复杂的匹配模式，那么一个圆括号的部分我们可以看作是
    *      一个子表达式/一个分组
    * 捕获：把正则表达式中子表达式/分组匹配的内容，保存到内存中以数字编号或显示命名的组里，方便
    *      后面引用，从左到右，以分组的左括号为标志，第一个出现的分组的组号为1，第二个为2，一次
    *      类推。组0代表的是整个正则式
    * 反向引用：圆括号的内容被捕获后，可以在这个括号后被引用，从而写出一个比较实用的匹配模式，这个
    *         我们称之为反向引用，这种引用既可以是在正则表达式内部，也可以是在正则表达式外部，内部
    *         内部反向引用 \\分组号，外部反向引用 $分组号
    * */
}
